package com.lcredu.web.datavalid;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.DataBinder;
import org.springframework.validation.Errors;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;
import java.util.Map;

/**
 * @author 黎长容
 * @date 2025-07-22 16:47
 */
@Controller
@Scope(value = "prototype")
public class MonsterHandler {

    /**
     * 验证
     * 1. 框架规定必须要在request域中有monster为属性的值
     *
     * @return
     */
    @RequestMapping("/addMonsterUI")
    public String addMonsterUi(Map<String, Object> hashmap) {
        hashmap.put("monster", new Monster());
        return "datavalid/monster_addUI";
    }

    /**
     * 黎长容知识03.
     * JSR303的使用
     * 1. 在javabean的字段加上相对应的注解
     * 2. 在需要验证的bean中添加注解@Validated
     * 3. 方法中添加 Errors errors,Map<String, Object> map可以用于回显
     * 4. 前端回显添加<form:errors path="name"/>
     * 5. 自定义回显: 1. spring配置文件中配置bean -- ResourceBundleMessageSource,并且指定配置文件i18n.properties
     *              2. 在src目录下创建文件-- i18n.properties
     *             
     * @param monster
     * @return
     */
    @RequestMapping("/save")
    public String save(@Validated Monster monster, Errors errors, Map<String, Object> map) {
        System.out.println("----monster----");
        System.out.println(monster);
        System.out.println("-----------map-----------------");
        for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
            String key = stringObjectEntry.getKey();
            Object value = stringObjectEntry.getValue();
            System.out.println(key + "====" + value);
        }
        
        List<ObjectError> allErrors = errors.getAllErrors();
        System.out.println("-----------error-----------------");
        if (errors.hasErrors()) {
            for (ObjectError error : allErrors) {
                System.out.println("error=" + error);
            }
            return "datavalid/monster_addUI";
        }

        return "datavalid/success";
    }
    
    /*
        黎长容知识02.
        忽略某个字段的值传入
        1. 写一个没有 返回值 的方法,并且用 @InitBinder 注解修饰
        2. 传入WebDataBinder 对象
        3. 取消需要忽略这个字段的验证
     */
//    @InitBinder
//    public void initBinder(WebDataBinder webDataBinder){
//        webDataBinder.setDisallowedFields("name");
//    }
}
